﻿namespace testObserver;

class Program
{
    static void Main(string[] args)
    {
        // 创建被观察者对象
        Stock? subject = new Stock();
        // 创建观察者对象并注册到被观察者
        Messenger? observerA = new Messenger();
        subject.Attach(observerA);

        // 更改被观察者状态，观察者会被自动通知
        subject.Price = 123;
        subject.Price = 789;
        // 移除观察者
        subject.Detach(observerA);

        // 更改状态，由于观察者已移除，不会收到通知
        subject.Price = 456;
    }
}
//【1】定义观察者接口IObserver和被观察者接口ISubject
public interface IObserver
{
    void Update(ISubject subject);
}
public interface ISubject
{
    //添加观察者
    void Attach(IObserver observer);
    //移除观察者
    void Detach(IObserver observer);
    //发生变化时,通知所有已注册的观察者Alert
    void Alert();
}
//【2】实现具体的被观察者类 Stock
//它包含注册和注销观察者的方法，以及在状态变化时通知所有观察者的方法：
public class Stock : ISubject
{
    private List<IObserver> _observers = new List<IObserver>();
    private int _price;
    public int Price
    {
        get => _price;
        set
        {
            _price = value;
            Alert();
        }
    }
    public void Attach(IObserver observer)
    {
        _observers.Add(observer);
    }
    public void Detach(IObserver observer)
    {
        _observers.Remove(observer);
    }
    public void Alert()
    {
        foreach (var observer in _observers)
        {
            //把当前对象传入观察者
            observer.Update(this);
        }
    }
}
//【3】创建具体的观察者类 Messenger，
//它实现 IObserver 接口，并在被通知时执行相应的操作：
public class Messenger : IObserver
{
    public void Update(ISubject subject)
    {
        if (subject is Stock Stock)
        {
            Console.WriteLine("Observer: Reacted to the event. Price: " + Stock.Price);
        }
    }
}